Подготовка

Устанавливаем Yii, в настройка (/protected/config.php) проекта включаем gii:

<?php

return array(

    //...

    'modules'=>array(
        'gii'=>array(
            'class'=>'system.gii.GiiModule',
            'password'=>'123',    
            'ipFilters'=>array('127.0.0.1','::1'),
        ),
    ),
    //...
);

Заодно раскомментируем urlManager и добавим соединение с БД:

<?php

return array(

    //...

    'components'=>array(

        //...

        'urlManager'=>array(
            'urlFormat'=>'path',
            'showScriptName' => false,
            'rules'=>array(
                '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        ),

        'db' => array(
            'connectionString' => 'mysql:host=localhost;dbname=yii_auth',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
        ),
        //...
    ),
    //...
);

Соединение с БД можно добавить в файл database.php, но я по старой привычки с более ранних версий yii добавляю в main.php.

Далее настроим соединение с БД для консольных команд, для этого открываем файд /protected/config/console.php и добавляем соединение с БД:

<?php

return array(

    //...

    'components'=>array(

        //...

        'db' => array(
            'connectionString' => 'mysql:host=localhost;dbname=yii_auth',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
        ),
        //...
    ),
    //...
);

В корень проекта добавляем файл .htaccess со следующим содержимым:

AddDefaultCharset utf-8

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

Yii 1, добавляем авторизацию через БД

Перейдем к добавлении авторизации через БД. Для начала необходимо добавить таблицу пользователей (user) в БД.

Таблица user будет содержать следующие поля:

id integer Id пользователя
email string Email пользователя, будем использовать для авотризации в качестве логина
password string Пароль пользователя, будем хранить как хеш md5
name string Имя пользователя
date integer Дата регистрации
status integer Статус, можем использовать для бана пользователей или чего-то подобного
role string Роль пользователя, для использования RBAC в дальнейшем

И так со структурой таблицы определились, добавляем ее в миграции (подробнее о миграциях можно прочитать здесь: Yii Framework. Миграции). Открываем консоль переходим в папку с проектом:

cd domains/mysite.local/protected

И выполняем команду создания миграции:

yiic migrate create create_user_table

Файл миграции создан, открываем его для редактирования (/protected/migration/m000000_000000_create_user_table.php) и добавляем код создания таблицы:

<?php

class m161218_121537_create_user_table extends CDbMigration
{
    public function up()
    {
        $sql = "CREATE TABLE IF NOT EXISTS `user` (
            `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
            `email` varchar(255) NOT NULL,
            `password` varchar(255) NOT NULL,
            `name` varchar(255) NOT NULL,
            `date` int(11) NOT NULL,
            `status` int(11) NOT NULL,
            `role` varchar(255) NOT NULL,
            PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
        Yii::app()->db->createCommand($sql)->execute();
    }

    public function down()
    {
        $sql = "DROP TABLE user";
        Yii::app()->db->createCommand($sql)->execute();
    }

}

После добавления кода создания таблицы user, применяем миграцию в консоле с помощью команды:

yiic migrate

Теперь создадим модель для таблицы user, открываем gii, переходим к разделу Model Generator заполняем форму и жмем "Preview" и "Generate" (в браузере, mysite.local/gii/model/index):

Gii создаст следующий класс (/preotected/models/User.php):

<?php

/**
 * This is the model class for table "user".
 *
 * The followings are the available columns in table 'user':
 * @property integer $id
 * @property string $email
 * @property string $password
 * @property string $name
 * @property integer $date
 * @property integer $status
 * @property string $role
 */
class User extends CActiveRecord
{

    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return 'user';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('email, password, name, date, status, role', 'required'),
            array('date, status', 'numerical', 'integerOnly'=>true),
            array('email, password, name, role', 'length', 'max'=>255),
            // The following rule is used by search().
            // @todo Please remove those attributes that should not be searched.
            array('id, email, password, name, date, status, role', 'safe', 'on'=>'search'),
        );
    }

    /**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
            'id' => 'ID',
            'email' => 'Email',
            'password' => 'Password',
            'name' => 'Name',
            'date' => 'Date',
            'status' => 'Status',
            'role' => 'Role',
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     *
     * Typical usecase:
     * - Initialize the model fields with values from filter form.
     * - Execute this method to get CActiveDataProvider instance which will filter
     * models according to data in model fields.
     * - Pass data provider to CGridView, CListView or any similar widget.
     *
     * @return CActiveDataProvider the data provider that can return the models
     * based on the search/filter conditions.
     */
    public function search()
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria=new CDbCriteria;

        $criteria->compare('id',$this->id);
        $criteria->compare('email',$this->email,true);
        $criteria->compare('password',$this->password,true);
        $criteria->compare('name',$this->name,true);
        $criteria->compare('date',$this->date);
        $criteria->compare('status',$this->status);
        $criteria->compare('role',$this->role,true);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }

    /**
     * Returns the static model of the specified AR class.
     * Please note that you should have this exact method in all your CActiveRecord descendants!
     * @param string $className active record class name.
     * @return User the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
}

В класс User добавим 2 константы. Это будут значения по умолчанию для полей status и role при добавлении (регистрации) новых пользователей. А так же поправим метод rules(), который отвечает за валидацию полей. В него мы добавим правила о том, что поле email должно быть уникальным, так как его мы будем использовать в качестве логина, и правило о том, что это поле должно быть именно email'ом. Так же добавим минимальную длину пароля в 5 символов:

<?php

class User extends CActiveRecord
{

    const DEFAULT_STATUS = 0;
    const DEFAULT_ROLE = 'user';

    //...

    public function rules()
    {
        return array(
        array('email, password, name, date, status, role', 'required'),
            array('email', 'email'),
            array('email', 'unique'),
            array('password', 'length', 'min' => '5'),
            array('date, status', 'numerical', 'integerOnly'=>true),
            array('email, password, name, role', 'length', 'max'=>255),
        array('id, email, password, name, date, status, role', 'safe', 'on'=>'search'),
        );
    }
    //...
}

Далее открываем класс /protected/components/UserIdentity.php, который отвечает за авторизацию пользователя и правим метод authenticate() следующим образом:

<?php

class UserIdentity extends CUserIdentity
{

    public function authenticate()
    {
        $record = User::model()->findByAttributes(array('email' => $this->username));
        if ($record === null) {
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        } else if ($record->password !== md5($this->password)) {
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        } else {
            $this->setState('title', $record->name);
            $this->setState('role', $record->role);
            $this->setState('uid', $record->id);
            $this->errorCode=self::ERROR_NONE;
        }
        return !$this->errorCode;
    }
}

Для того что бы уменьшить переделывание кода, вместо email, при авторизации будем использовать username, но при желании это можно исправить в следующих файлах: /protected/components/UserIdentity.php, /models/LoginForm.php и /protected/views/site/login.php. Все остальное оставляем (view авторизации (login) и actionLogin) как было по умолчанию.

Авторизация готова, можем протестировать авторизацию через БД в Yii 1, для этого добавляем нового пользователя в таблицу user через phpMyAdmin (незабудте указать функцию md5 для пароля при добавлении пользователя) и открываем страницу авторизации (mysite.local/site/login).

Теперь когда авторизация работает, можем перейти к регистрации. Список статей по теме: Yii Framework, авторизация, регистрация и восстановление пароля через БД.